#ifndef SYMBOLEVALUE_H
#define SYMBOLEVALUE_H

#include <string.h>
#include <iostream>
using namespace std;

#include "Symbole.h"
#include "Arbre.h"
#include "Valeur.h"

/*! \file SymboleValue.h
        \brief La spécification de la classe SymboleValue
        Décrit la liste des méthodes et attributs associés à la classe SymboleValue
        \author Ribes Gaël, Pauli Marie
        \date 04.01.2012
 */

/*! \class SymboleValue
\brief La classe représentant les Symboles Values.
Cette classe permet de représenter sous la forme d'un objet
une variable de type SymboleValue. Les méthodes suivantes sont associées
à un objet de type SymboleValue :
        \li getValeur
        \li setValeur
        \li afficher
 */

class SymboleValue : public Symbole, // un symbole valué est un symbole qui a une valeur, définie ou pas
public Noeud { // et c'est aussi une feuille de l'arbre abstrait
public:

    /*! \fn SymboleValue(Symbole s)
            \brief Constructeur de la classe SymboleValue.
    Ce constructeur construit un symbole valué à partir d'un symbole existant s
            \param s - le symbole déjà existant
     */
    SymboleValue(Symbole s); // construit un symbole valué à partir d'un symbole existant s

    /*! \fn ~SymboleValue( )
\brief Destructeur de la classe SymboleValue.
     */
    ~SymboleValue() {
    }

    /*! \fn Valeur* getValeur()
\brief Retourne la valeur du SymboleValue.
\return la valeur du SymboleValue.
     */
    inline Valeur* getValeur() {
        return this->valeur;
    }

    /*! \fn void setValeur(Valeur* valeur)
\brief Permet de définir la valeur d'un SymboleValue.
\param valeur - la valeur souhaitée.
     */
    inline void setValeur(Valeur* valeur) {
        this->valeur = valeur;
        this->defini = true;
    }
    /*! \fn void afficher (unsigned short indentation=0)
        \brief Affiche la valeur
        La fonction permet l'affichage de la valeur du SymboleValue.
        \param indentation - marge avant l'affichage.
     */
    void afficher(unsigned short indentation = 0); // affiche le symbole en tant que noeud de l'arbre
    friend ostream & operator <<(ostream & cout, SymboleValue symb); // affiche un symbole value sur cout
private:

    /*! \var Valeur* valeur
\brief Contient la valeur d'un SymboleValue.
     */
    Valeur* valeur;


    /*! \var bool defini
    \brief Si la valeur est définie ou pas (peut ne pas être définie à l'initialisation.)
     */
    bool defini;
};

#endif /* SYMBOLEVALUE_H */
